EASY BASE NETWORKING GUIDE Contents Introduction Page 1 Batch Starting Page 3 Clearing Locks Page 4 Configuration Page 6 Development Work Page 7 File Open On Server Page 9 Lock Directory Page 10 Numbering Records Page 11 Private Keyword Page 12 Protective Locking Page 13 Self Locking Loops Page 16 Strategic Locking Page 17 Terminal Number Val. Page 18 Unique Entries Page 19 ................................................................................ Introduction Introduction Easy Base Networker has been designed to make the creation of multi user data management systems as simple as possible. To do this it incorporates automatic locking and privatisation routines. With a few exceptions, you can create multi user systems just as if you were writing for a stand alone PC. The few exceptions are, however, important so please read this short guide before attempting to convert any single user application. Because Easy Base is an interpreter, the same program is used both for the creation of your application and for running it. Only the running routines are multi user. Multiple work stations can access the same forms and procedures simultaneously only when such forms and procedures are called from pre defined user menus. Multiple work stations can access the form and procedure design routines (System Menus) provided they are each doing design work in different data sub directories. No two work stations can access the system menus for the same data sub directory at the same time. Terminology used in this Guide. PUBLIC FILES: Files to which all work stations have access. The public files are form definition, data and procedure definition files together with the network common configuration file. PRIVATE FILES: Files for which each work station has its own copy. The private files are: user menus, terminal configuration, procedure output subindex and temporary forms. You can also write to private copies of public form definitions for temporary storage by using the keyword "Private". TERMINAL NUMBER:- This is a unique number assigned to each work station logged on to Easy Base. The terminal number is used in the naming of the work station's private files and for recording which work station has placed any access lock. SYSTEM LOCKS The locks which Easy Base engages to prevent simultaneous loading and simultaneous access to the system menus in any one data sub directory. PROTECIVE LOCKS The locks which Easy Base engages to prevent index file - 1 - ................................................................................ Introduction Introduction corruption during multiple access. STRATEGIC LOCKS The locks you set in procedure code when you require a form to be locked for non protective reasons. Easy Base Networker was developed under Novell Personal Netware. It does not, however, contain any Novell specific code and should be reliable on any DOS based network system. To get started, install Easy Base to a new directory on a server. Allocate a drive letter for your work stations to reference this directory and set your network software to allow unrestricted read and write access to all files in that directory and all sub directories under it. To log on to Easy Base, three parameters are required. The terminal number to use, The data sub directory to operate in and a password for either the system menus or a user menu. From a work station, change to the drive you have allocated and type "EB". When you start Easy Base with the command EB you will be asked to supply the three parameters which it requires. All three parameters can be supplied automatically either by setting them in the environment ( Work stations which self boot ) or by placing them on the command line. ( See Batch Starting ) All locking in Easy Base is by "Soft lock". DOS file and record locking techniques are not used. With any locking strategy, locks can be left engaged if a work station suffers a power failure or is switched off without exiting the program. System and Access locks which are left engaged after a power failure can be cleared by Easy Base or by DOS file erasure. (See Clearing Locks ) Applications written in previous stand alone versions of Easy Base can be copied directly to a sub directory of Easy Base Networker. However, the pre processed (.PPR) files created by Version 9 are NOT compatible with Network V1 and must be erased before use. You can erase all .PPR files by selecting Relationships from the main system menu. The system values Total Records, Total Copies and Current Record no longer exist. Any procedure which uses these values must be changed. They are now available as pseudo fields Form.Total Records, Form.Total Copies and Form.Record Number. - 2 - ................................................................................ Batch Starting Batch Starting You can by pass entering any or all of the sign on parameters either by setting them in the environment of the work station or by supplying them on the command line. To have a work station automatically log on as terminal 1 in the sub directory accounts with the password "Fred", add the following lines to the work station's Autoexec.Bat file:- SET EBT=1 SET EBD=ACCOUNTS SET EBP=FRED Or start Easy Base with the command line :- EB T=1 D=ACCOUNTS P=FRED Any parameters which are not supplied either in the environment or on the command line will be asked for on start up. If you have set the start up parameters for any given work station in the environment and you start Easy Base with different parameters on the command line, the parameters on the command line override those in the environment. If your application has different passwords for different menu structures you can set the terminal number and directory and leave the user to supply the password. If the user has access to different directories then just set the terminal number and the user can choose the directory and enter the password. NOVELL WARNING If you save a "Login Script" after setting EB environment variables and subsequently change the settings in your Autoexec.bat file, Novell will swap the setting it saved for the new ones whenever you login. Saving a new Login script after the change does not rectify the situation. You actually have to find the login script file and edit out the old environment settings. Under Novell Personal Netware this file is called PNWLOGIN.SCR and is stored in a numbered sub directory under C:\NWCNTL\MAIL - 3 - ................................................................................ Clearing Locks Clearing Locks ACCESS LOCKS If a data access lock is left engaged it can be cleared by selecting "Clear Access Locks" from the utilities menu. You can also make "Clear Access Locks" available on user menus. When you run "Clear Access Locks" Easy Base clears all access locks in the current data sub directory. Because it clears ALL locks in the current directory you should ensure that no other work stations currently require locks in place - ie they should not be running procedures or adding or modifying records. There is no need for them to log out of Easy Base. SYSTEM LOCKS Easy Base uses two system locks - a loading lock and a System Menus lock. Because of the way Easy Base initially loads its overlays, no two work stations can load at the same time. When a work station attempts to load Easy Base while another work station is loading, Easy Base displays the message "Please wait another terminal is loading". As soon as the first work station has logged on this message will clear and the second will load. If the first terminal suffers a power failure while loading, this lock will be left engaged. If the loading lock does not clear within one minute, The "Please wait" message displayed on any other work station which is trying to load is replaced with one which allows the user to escape and enter the reset command. To clear the loading lock type "EB reset" at the command prompt. Whenever a work station is accessing the system menus for any given data sub directory, all other terminals are locked out of the system menus in that directory. If a work station is powered off without leaving the system menus then this lock will be left engaged and no work station will be able to access the system menus for that directory. The system menu lock is also cleared by typing "EB reset" at the command prompt. WARNING It is essential to your data integrity that no two work stations log in to Easy Base with the same terminal number. To prevent this Easy Base maintains a log of which terminal numbers are in use. This log is erased when you issue the command "EB reset". If one or more terminals are logged on to Easy Base and another issues the command "EB reset" then it will be able to log on with a terminal number which is already in use. You must prevent this as the two work stations with the - 4 - ................................................................................ Clearing Locks Clearing Locks same terminal number will overwrite each others private files and ignore each others data access locks with unpredictable results. If you have arranged for each work station to supply its parameters from the environment or from the command line in a batch start this is not a problem, but if you allow work station operators to choose their terminal number it is. To be absolutely sure, you should ensure that all work stations exit Easy Base before issuing the "EB Reset" command and log back in after it. DOS LOCK CLEARING All Easy Base locks can be cleared manually by erasing the locking files. The locking files are:- Loading Lock EB.LOD Easy Base Directory System Menus Lock EB.LOG Easy Base Directory Directory Lock DIR.LOC Data Directories Form Locks Base(No).LOC Data Directories - 5 - ................................................................................ Configuration Configuration The utilities Install Printer, Options, Screen Colours and Set Paper Length described in the programmers reference are combined under "Configuration" on the main menu in the network version of Easy Base. You can also add configuration to a user menu. Apart from date and numeric formatting, all configuration items are private to the terminal being configured. You can therefore install different printers on different workstations. When you install a printer in Easy Base you only have the option to send output to LPT1 or LPT2. When you select an LPT port the output will be sent either to a printer connected to that port or to a network printer that has been mapped to it by your network software. CAUTION: Novell netware reports three LPT ports on all workstations even if they only physically have one. If you set output to LPT2 and your workstation has no physical LPT2 and no network printer has been mapped to LPT2 then Easy Base will hang up when you try to print. When you change the network common items, date and numeric format. They only take effect on other workstations from the next time they log in. - 6 - ................................................................................ Development Work Development Work When you are doing development work from the system menus there should not be any other operator accessing forms or procedures in the data directory you are working in. This does not mean that you cannot have a second workstation accessing that directory under your control. It is in fact preferable to have a second workstation for testing purposes. There are aspects of design work that Easy Base does not and in some cases cannot provide locking for. This section will explain how to avoid conflicts. The only system operations which are fully protected are Data entry from the system menus and packing forms. You can perform these operations safely even when other operators are active. Whatever system operation you perform, there will be no conflict if the other active workstation/s are at rest displaying a user menu. To make and test modifications to an application, provide access to the system menus from your user menu and start your application on the user menu for both workstations. One workstation can then access the system menus while the other remains on the user menu. After modifying a form or procedure you can then escape to the user menu and test the modification in a multi user environment. Modifications to forms, relationships and procedures are effective immediately. Modifications to User Menus, Vat rates and network common configuration items take effect the next time a workstation logs on or changes directory. If, for example, you change your user menu structure then you must select Change data directory and select the same directory again before it is displayed. If your application is in constant use, you can minimize down time by making and testing your modifications in a spare directory with a copy of the App. Once you are happy, other users only have to be shut down while you make the modifications in the live directory and not while you do your testing. If you absolutely have to make modifications without shutting down other workstations then there is only one operation which can actually corrupt your data. That is if you modify a form such that its record length changes. You MUST NOT do this while any other workstation is in data entry to that form or is running a procedure which updates that form. The other work station will continue using the old record length and corrupt the data file. All other operations may or may not cause - 7 - ................................................................................ Development Work Development Work spurious system errors on either your workstation or one of the others but will not normally affect data. Whenever you add modify or delete forms, procedures, relationships, choice lists or user menus Easy Base erases and re writes the definition file and the form, procedure or choice list directory file. Any workstation which attempts to read from a file between the erase and re write will crash, and your workstation will crash if it actions the erase while another workstation has the file open. - 8 - ................................................................................ File Open on Server File Open on Server If a workstation fails and it had files open at the time, then your network server will prevent any other workstation from erasing those files before the failed workstation logs back in to the network. There are several processes in Easy Base which erase files. These are, packing, the procedure commands "clear records from" and "rename temp as" as well as form, relationship and procedure modifications from the system menus. If any workstation suffers a power failure while accessing Easy Base you should re start it and log back on to the network as soon as possible. If the failed workstation did not have files open at the time of the failure then other workstations will continue to work normally. If it did have files open then any workstation which tries to erase one of those files will crash with a "File Open on Server" message. Any such errors will cease as soon as the failed workstation logs back on to the network. If the failure was such that the failed workstation cannot be restarted then you must shut down and restart the server. During most activity in Easy Base, it is unlikely that a workstation failure will cause problems. There is one major exception to this. That is if a workstation fails while packing a form. If a workstation fails while packing a form, Easy Base will restart the packing process automatically the first time any workstation logs on to that data directory. If the failed workstation has not logged back in to the network then any other workstation logging on to the data directory will crash with the "File Open on Server" message. In other words, no workstation will be able to access the data directory until either the failed workstation is back on the network or the network server has been restarted. You may also get a "File Open on Server" error if any other program such as a fileviewer opens an Easy Base file. - 9 - ................................................................................ Lock Directory Lock Directory When you need to make modifications to an application you can prevent other workstations from logging on to the directory you are about to modify by selecting "Lock Directory" from the utilities menu. If any other workstations are active in the directory when you select Lock Directory, Easy Base will list their terminal numbers on screen. When all other workstations have logged out of the directory the lock will engage. When you have finished your modifications select "Clear Access Locks" to clear the directory lock. Apart from application modifications, the directory lock should be used before backup, restore or data import routines. Once a directory lock has been set, only a workstation using the terminal number which set it can access the directory. - 10 - ................................................................................ Numbering Records Numbering Records If you are converting a single user application then you may have to adjust your code where records are entered via a procedure and each record has to have a consecutive number in one of its fields. In single user applications record numbering is often done by having a "Last" form which holds a single record with the last record number in it. The procedure which enters new records derives the next record number in a field on its input screen with the derivation :- Lookup(Last,Number) + 1 and the procedure code updates the last form :- For Last Last.number = input.number Update record Next In a multi user environment this is not reliable. If another workstation starts the procedure after yours has done the lookup but before you run the procedure then both workstations will derive the same number on screen. To ensure correct numbering your procedure code must re-check the Last.number value when it is run. For Last input.number = last.number + 1 Last.number = input.number Update record next Although this will ensure correct numbering, it may be off putting to see the same record number on two screens. To avoid this you can declare a variable to pick up the number in and delete the input.number field. The code would then be:- Declare variables number as number end for last number = last.number + 1 Last.number = number Update record next For form new record form.number = number copy all from input next - 11 - ................................................................................ Private Keyword Private Keyword One of the main differences between stand alone and multi user applications is that where a form is used for temporary storage each workstations temporary records must be kept separately. For example, in an order taking application you might have one procedure which looks up stock items and enters them to an "OrderItems" form. When all the items have been entered another procedure prints out the order and clears down the "OrderItems" form. If these procedures are to be used by more than one work station then, clearly, the items entered by one station must be stored separately from those entered by another. In many data management systems this would involve separate forms and procedures for each work station. In Easy Base you can separate data by placing the keyword "Private" at the end of any for loop and at the end of the "clear records from" command. In this example the following procedures can be used by any number of work stations to create separate orders using the same procedures and OrderItems form. For OrderItems new record private Copy all from input Next ......................................... For OrderItems private Total = Total + orderitems.price print list items next Print report footer ......................................... Clear records from OrderItems private As an aid to debugging you can view the records which have been entered privately for any workstation by pressing Ctrl + P when in data entry to the form. CAUTION The provision of private data files is for temporary storage in applications like the one described above. It is not suitable for keeping permanent private records. There are no facilities for packing or reformatting the private data file. Private records can only be removed with the "Clear records from form private" command in procedure code. If you modify a form which has private data records the private data is not reformatted to the new form definition and the old data must be erased with the "Clear records from" command before use. - 12 - ................................................................................ Protective Locking Protective Locking The Easy Base protective locking allows any number of work stations to read or write to data files simultaneously where no index file is involved. It allows any number of workstations to read via the same index file simultaneously but prevents any workstation from writing to an index file that is being read from. It prevents simultaneous writing to the same index file and any file from being erased while in use. Whenever a workstation attempts a process that is locked by another work station Easy Base waits for the lock to be released. If the lock is not released within four seconds Easy Base displays the message "Waiting for Access - Esc Cancel". If the user presses the escape key with this message on screen, the process is cancelled. If the process was in data entry to a form the workstation remains in data entry to that form and is ready to accept any other input. If the process was during a procedure then the procedure is terminated. If it had a repeating input screen, control returns to the input screen and if it did not, control returns to the menu from which it was called. The protective locking routines in Easy Base are automatic apart from two options. 1. In certain procedures you will not wish to allow the user the option to cancel the procedure when he has to wait for a lock to clear. To do this, place the command "Wait" in the procedure code after output field and variable declarations. If the command "Wait" has been issued and the procedure encounters a lock which lasts more than four seconds then Easy Base still displays the message "Waiting for Access" but the escape key is not active. 2. Easy Base provides two options for locking while a procedure reads records using an index file. Consider the code:- For Customers with Surname in order Print list items next For this procedure to complete successfully, no other work station must write to the index file on Surname during the procedure. If there are many records in the customers file and the output is being sent to a printer then other workstations could be prevented from adding modifying or deleting records in the customers form for some considerable time. As well as reading directly from the Customers.Surname index Easy Base can also make a private copy of the index file as it stands at the start of the procedure. The Customers form is locked only for as long as it takes to make the copy. Once the - 13 - ................................................................................ Protective Locking Protective Locking file has been copied, other workstations are free to write to the customers form and the procedure selects records using its private copy of the index file. By default, Easy Base locks the form against write processes during the procedure. To take the private index option add the command "No Lock" to the end of the "For" line. For Customers with surname in order no lock There are pros and cons for both methods and the exact nature of your application will determine which should be used in any given for loop. The default system prevents writing to the form for the duration of the loop but has no anomalies in the output. The copy index method locks the form for the minimum time, but if the indexed field of any record is altered by another workstation the altered record may be processed out of order. For example, in this loop, if another workstation changes a customers surname from Smith to Jones before the procedure reaches the Smiths, you will have a Jones listed among the Smiths in your printout because that is the record's position in the private index. The "No Lock" option should only be applied to for loops of public files. It should not be applied to any loop which is already private. :- PickList, Temp, any loop using the private keyword and any loop using a subindex are automatically private. EASY BASE AUTOMATIC LOCKING SUMMARY File Erasure (Packing, Clear records from, Rename temp as) :- None of these processes will start while any other workstation is accessing the form to which they apply. Once they have started, no other workstation can access the form until they are complete. Data Entry to forms :- File erasure is not permitted at any stage. Write locking is engaged during an F3 search on an indexed field and while any other workstation makes a lookup from one of the forms indexed fields. Read and write locking is engaged during F2 add or update record and during F7 delete record. Procedures :- In procedures, locks are set separately for each "For" loop. - 14 - ................................................................................ Protective Locking Protective Locking When loops are nested, the locks set by each loop are retained until the procedure exits the outermost loop when they are all cleared together. Loops of Picklist, Temp, Subindex and any loop using the private keyword have no locking as the files involved are private to the workstation. Unqualified loops ( For Form ) Lock against file erasure only. Loops qualified by "With" set a write lock on the form. Loops qualified by "New Record" or containing the commands "Update record" or "Delete record" lock the form against read or write. A loop prefixed by "Index Off" follows the same rules as for Packing. It will not start while any other workstation is accessing the form and once started, no other workstation can access the form until it is finished and the indexes are rebuilt. - 15 - ................................................................................ Self Locking Loops Self Locking Loops When For Loops of the same form are nested in a procedure Easy Base ignores any lock which the workstation has set for the outer loop when it starts the nested one. It does not ignore any lock set by another workstation. It is therefor possible to write a procedure which cannot be run on two workstations simultaneously because they will each lock each other. For parts with number = input.number for parts alias addone new record copy all from parts Addone.number = jointext(input.number,"a") next next Although a legitimate procedure in a single user environment, this will self lock if run on two workstations. The first line sets a read only lock on the parts form. A single workstation will ignore its own lock and write the new record but if two workstations run the procedure neither will be able to write the new record until the other releases its read only lock. Such procedures are seldom necessary and when they are you can avoid the problem by making the read only lock the inner one. For parts new record for parts alias getone with number = input.number parts.name = getone.name parts.Qty = getone.Qty parts.number = jointext(input.number,"a") next next Although the convenience of using "Copy all from" has been lost this procedure will not self lock. The outer loop now locks read and write access to the parts form so any other work station attempting to run the same procedure cannot start until this one has finished. - 16 - ................................................................................ Strategic Locking Strategic Locking Strategic locks are locks which are not covered by the automatic protective locking but are none the less necessary for the correct operation of an application. Strategic locks are set by the procedure command Lock and cleared by the command Unlock. Strategic locks will not engage while any other workstation is accessing the form to be locked and once set prevent any other workstation from accessing the form before the Unlock command has been issued. Each Lock command must have a matching Unlock command but they need not necessarily be in the same procedure. If a form has to be locked while several procedures run from a batch menu, for example, then the first procedure can lock the form and the last can unlock it. Strategic locks are seldom required in applications which simply store and report on data. In transactional applications however, they are often essential. As an example, a form "Work" contains records of the hours worked by employees - one record for each time each employee clocks in. Each record also has a number field and procedures which enter records to the form derive the record number field from a form "Last" which contains a single record with the last record number in form "Work". When a single employees records are deleted from the form, the form is packed, the records are renumbered and the entry in the "Last" form is updated with the new number of records in "Work" The Easy Base protective locking will prevent any other work station from entering a new record during the deletion loop and during the pack. It will not prevent it from entering a new record between the deletion loop and the pack or between the pack and the updating of the "Last" form. To ensure that no other workstation adds a new record to work before the "Last" form is updated the "Last" form must be locked throughout. Lock Last For Work with employee = input.employee Delete record Next Pack Work For Last For Work x = x + 1 : Work.number = x Update record Next Last.number = x : Update Record Next Unlock Last - 17 - ................................................................................ Terminal Number Val. Terminal Number Val. The System value "Terminal Number" is available in field derivations and procedure code and returns the terminal number used to log on to Easy Base. The main use of the Terminal Number value is to privatize lookups in temporary storage forms. As an example, an invoicing system might have one procedure which looks up a customers number from the "customers" form and looks up the next invoice number from the "last" form. It then enters a record in the "current" form so that the next procedure, which looks up stock items and enters them privately to the "invoicelines" form, can automatically lookup the "Current.Customer" and "Current.invoice". If multi workstations are to use these procedures at the same time then each must be able to lookup its own Current.Customer and Current.Invoice. To do this, in say a six terminal application, six records are pre entered to the "current" form with the values 1,2,3,4,5 and 6 in the terminal field. The first procedure has the code:- Declare variables No as number end for last No = last.invoiceno + 1 last.invoiceno = No Update record next for current with terminal = terminal number current.customer = input.customer current.invoiceno = no Update record Next The procedure which enters the invoicelines has a hidden field "Terminal" derived :- Terminal Number and looks up the current invoice number and customer based on a relationship linking this field with the terminal field in the "Current" form. The Terminal Number value can also be used to create private entries in public forms. If a public form "Notes" has a field "Terminal" and each workstation enters its notes together with its terminal number then the procedure: For Notes with terminal = terminal number Print list items next Will only print the notes entered by the workstation running the procedure. - 18 - ................................................................................ Unique Entries Unique Entries Where new records are entered to forms via procedures and one of the fields in the form must be unique, the procedure must test to see if the value it is about to enter in the unique field already exists. In single user applications this test can be accomplished solely on the input screen. To check a unique field "Name" in form Parts the input screen name field would be derived:- If(lookup(parts,name) = name,blank[beepPart Name Exists !Cursor name],name) In a multi user environment this is no longer reliable. If two workstations enter the same name on their input screens at the same time they will both pass the lookup test above. To ensure a unique entry you must re check if the value exists at the start of the procedure code and return to the input screen if the value has been taken since the field was filled. Declare variables x as number end For parts new record for parts alias checkit with name = input.name x = x + 1 next if x > 0 then beep Display Status "This part name already exists !" Delay 2000 Recall input screen end if copy all from input next When the line "For parts new record" is processed, the parts form is locked so no other workstation can add a record. If the name does not exist then the procedure adds the new record but if it does the operator is warned by the beep and status display and the procedure returns to the input screen without adding the new record. - 19 - ................................................................................